package com.forum.user.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.forum.common.utils.R;
import com.forum.user.service.ForumUserService;
import com.forum.user.vo.UpdateUserPasswordVo;
import com.forum.user.vo.UserVo;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import com.forum.user.entity.ForumUser;
import com.forum.user.service.ForumUserService;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author bncgnc
 * @since 2022-01-04
 */
@Slf4j
@RestController
@RequestMapping("/user/forumUser")
public class ForumUserController {
    @Autowired
    private DefaultKaptcha defaultKaptcha;
    @Autowired
    private ForumUserService forumUserService;

    /**
     * 根据用户名查询用户，支持模糊查询
     * @param forumUser
     * @return
     */
    @RequestMapping("/findUserByName")
    public R findUserByName(ForumUser forumUser){
        return forumUserService.findUserByName(forumUser);
    }

    /**
     * 验证码生成
     * @param request
     * @param response
     * @param uuid
     * @throws IOException
     */
    @GetMapping("captcha.jpg")
    public void getCaptcha(HttpServletRequest request , HttpServletResponse response , String uuid) throws IOException {
//        System.out.println("header : " + request.getHeader("Oauth-Token"));

        // 创建字节数组用户存放图片信息
        byte[] numCodeImgByte = null;
        // 获得二进制输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 通过DefaultKaptcha获得随机验证码
//        String code = defaultKaptcha.createText();
        // 将验证码存放在session中
        request.getSession().setAttribute("uuid",uuid);
        // 生成图片
        BufferedImage image = defaultKaptcha.createImage(uuid);
        // 将图片写入到流中
        ImageIO.write(image, "jpg", baos);
        numCodeImgByte = baos.toByteArray();
        // 通过response设定响应请求类型
        // no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用     缓存。
        response.setHeader("Cache-Control","no-store");
        // no-cache指示请求或响应消息不能缓存
        response.setHeader("Pragma","no-cache");
        /* expires是response的一个属性,它可以设置页面在浏览器的缓存里保存的时间 ,超过设定的时间后就过期 。过期后再次
         * 浏览该页面就需要重新请求服务器发送页面数据，如果在规定的时间内再次访问次页面 就不需从服务器传送 直接从缓存中读取。
         * */
        response.setDateHeader("Expires", 0);
        // servlet接受request请求后接受图片形式的响应
        response.setContentType("image/jpeg");
        // 通过response获得输出流
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(numCodeImgByte);
        outputStream.close();
    }

    /**
     * 用户注册
     * @param forumUser
     * @return
     */
    @PostMapping("/register")
    public R register(ForumUser forumUser){
        return forumUserService.register(forumUser);
    }

    /**
     * 用户登录
     * @param userVo
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody UserVo userVo){
        log.info("userVo : {}" , userVo);
        return forumUserService.login(userVo);
    }
    @GetMapping("/logout")
    public R logout(@RequestHeader("Authorization") String token){
        return forumUserService.logout(token);
    }

    /**
     * 验证用户登录状态
     * @param token
     * @return
     */
    @GetMapping("/currentUser")
    public R currentUser(@RequestHeader("Authorization") String token) {
        ForumUser forumUser = forumUserService.checkToken(token);
        return R.ok().put("data" , forumUser);
    }

    //listAllUser

    /**
     * 用户管理员查看所有普通用户的信息
     * @param forumUser 该参数时管理员用户的信息，用来获取管理员的状态码
     * @return
     */
    public R listAllCommonUser(ForumUser forumUser){
        return forumUserService.listAllCommonUser(forumUser);
    }

    /**
     * 修改用户基本信息，如用户昵称、Email、userPhonenum
     * @param forumUser
     * @return
     */
    public R updateUserBase(ForumUser forumUser){
        return forumUserService.updateUserBase(forumUser);
    }

    /**
     * 修改密码
     * @param updateUserPasswordVo
     * @return
     */
    public R updateUserPassword(UpdateUserPasswordVo updateUserPasswordVo){return forumUserService.updateUserPassword(updateUserPasswordVo);}
    //deleteUser

    /**
     * 删除用户，彻底删除
     * @param id 被删除的用户的id
     * @return
     */
    @GetMapping("deleteUser/{id}")
    public R deleteUser(@PathVariable Long id){
        return forumUserService.deleteUser(id);
    }


    //后台管理需要：根据当前页数与limit查询数据
    @GetMapping("getUserList/{current}/{limit}")
    public R getUserList(@PathVariable Long current,@PathVariable Long limit){
        Page<ForumUser> page = new Page<>(current,limit);
        forumUserService.page(page,null);
        Long total = page.getTotal();
        List<ForumUser> userList = page.getRecords();
        return R.ok().put("userList",userList).put("total",total);

    }
}





